package com.automapper.criterion;

import java.util.List;

import com.automapper.exception.AutoMapperException;

public class Restrictions {
	
	private Restrictions() {}

	/**
	 * 等于（=） 查询条件
	 * @param propertyName 列名
	 * @param value 值
	 * @return
	 */
	public static Criterion eq(String propertyName, Object value) {
		return new SimpleExpression(propertyName, value, "=");
	}
	
	/**
	 * 不等于（!=） 查询条件
	 * @param propertyName 列名
	 * @param value 值
	 * @return
	 */
	public static Criterion ne(String propertyName, Object value) {
		return new SimpleExpression(propertyName, value, "!=");
	}
	
	/**
	 * 大于（>） 查询条件
	 * @param propertyName 列名
	 * @param value 值
	 * @return
	 */
	public static Criterion gt(String propertyName, Object value) {
		return new SimpleExpression(propertyName, value, ">");
	}
	
	/**
	 * 大于等于（>=） 查询条件
	 * @param propertyName 列名
	 * @param value 值
	 * @return
	 */
	public static Criterion ge(String propertyName, Object value) {
		return new SimpleExpression(propertyName, value, ">=");
	}
	
	/**
	 * 小于（<） 查询条件
	 * @param propertyName 列名
	 * @param value 值
	 * @return
	 */
	public static Criterion lt(String propertyName, Object value) {
		return new SimpleExpression(propertyName, value, "<");
	}
	
	/**
	 * 小于等于（<=） 查询条件
	 * @param propertyName 列名
	 * @param value 值
	 * @return
	 */
	public static Criterion le(String propertyName, Object value) {
		return new SimpleExpression(propertyName, value, "<=");
	}
	
	/**
	 * in 查询条件
	 * @param <T>
	 * @param propertyName 列名
	 * @param values 值
	 * @return
	 */
	public static <T> Criterion in(String propertyName, List<T> values) {
		return new SimpleExpression(propertyName, values, "in");
	}
	
	/**
	 * 两列等于（=） 查询
	 * @param propertyName
	 * @param otherPropertyName
	 * @return
	 */
	public static Criterion eqProperty(String propertyName, String otherPropertyName) {
		return new PropertyExpression(propertyName, otherPropertyName, "=");
	}
	
	/**
	 * or查询条件
	 * 生成查询条件例子：where (a.id = 1 or b.id = 1) 
	 * @param criterions
	 * @return
	 */
	public static Criterion or(Criterion...criterions) {
		return new Disjunction(criterions);
	}
}
